/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import dao.Dao;
import dao.UsuarioJpaController;
import dominio.Usuario;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author igo
 */
public class UsuarioNegocio implements Negocio {

    private Dao dao;
    private String mensagem;
    public static final int CAMPOS_OBRIGATORIOS = 2;

    public UsuarioNegocio() {
        dao = new UsuarioJpaController();
    }

    /**
     *  Esta função insere o objeto Funcionario parâmetro no banco de dados
     * @param funcionario
     */
    public boolean inserir(Object objeto) {
        if (objeto == null) {
            mensagem = "Funcionário nulo";
            return false;
        }
        Usuario usuario = (Usuario) objeto;

        if (camposObrigatorios(usuario) < CAMPOS_OBRIGATORIOS) {
            mensagem = "Preencha todos os campos obrigatórios";
        }

        if (!loginUnico(usuario)) {
            mensagem = "Login requirido já está sendo usado!";
            return false;
        }

        try {
            dao.create(usuario);
            mensagem = "Usuario inserido com sucesso!";
            return true;
        } catch (Exception e) {
            mensagem = "Erro no BD, tente mais tarde";
        }
        return false;
    }

    /**
     *  Esta função atualiza o banco de dados com as informações do objeto Usuario fornecido como parâmetro
     * @param Usuario
     */
    public boolean alterar(Object objeto) {
        if (objeto == null) {
            mensagem = "Usuario nulo";
            return false;
        }
        Usuario usuario = (Usuario) objeto;
        if (camposObrigatorios(usuario) < CAMPOS_OBRIGATORIOS) {
            mensagem = "Campo Obrigatório em branco!";
        }

        try {
            dao.edit(usuario);
            mensagem = "Usuario Alterados com sucesso!";
            return true;
        } catch (Exception e) {
            mensagem = "Erro no Banco de Dados. Tente novamente, mais tarde!";
        }
        return false;
    }

    /**
     *
     * @param Funcionario funcionario
     * @return o número de campos obrigatórios preenchidos
     */
    private int camposObrigatorios(Usuario usuario) {
        int i = 0;
        if (usuario != null) {
            if (!usuario.getLogin().equals("")) {
                i++;
            }
            if (!usuario.getSenha().equals("")) {
                i++;
            }
        }
        return i;
    }

    private boolean loginUnico(Usuario usuario) {
        List<Object> res = dao.pesquisar(usuario);
        if (res != null && (!res.isEmpty())) {
            for (Object o : res) {
                Usuario u = (Usuario) o;
                if ( usuario.getLogin().equals(u.getLogin()) ) {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * Método que exclui um objeto Usuario do banco de dados por meio de seu id
     *
     * @param Usuario
     */
    public boolean excluir(Object objeto) {
        if (objeto == null) {
            mensagem = "Usuario nulo";
            return false;
        }
        Usuario usuario = (Usuario) objeto;
        if (usuario != null) {
            try {
                dao.destroy(usuario.getLogin());
                mensagem = "Usuario excluído com sucesso";
                return true;
            } catch (Exception e) {
                mensagem = "Erro no Banco de Dados";
            }

        } else {
            mensagem = "Usuario nulo!";
        }
        return false;
    }

    /**
     *
     * @return Lista de todos os objetos Usuario existentes no banco de dados
     */
    public List listar() {
        List res = dao.findObjectEntities();
        return res;
    }

    /**
     *
     * @param Usuario
     * @return Lista com todos os objetos Usuario existentes no banco de dados que tenham as características do objeto Fucionario fornecido como parâmetro
     */
    public List pesquisar(Object objeto) {
        if (objeto == null) {
            mensagem = "Usuario nulo";
            return null;
        }
        Usuario usuario = (Usuario) objeto;
        if (camposObrigatorios(usuario) == 0) {
            mensagem = "Um campo Obrigatório deve ser preenchido!";
            return null;
        }
        List res = new ArrayList<Usuario>();
        /*if (usuario.getId() != null) {
        Usuario u = dao.findUsuario(usuario.getId());
        res.add(u);
        mensagem = "Apenas Um encontrado";
        return res;
        }*/
        res = dao.pesquisar(usuario);
        if (res.isEmpty()) {
            mensagem = "Nada encontrado!";
            /*
             * retornará null para facilitar a organização do controlador da janela
             * assim, toda vez q esse método retornar null, o controlador da janela
             * virá buscar a mensagem.
             */
            return null;
        }
        return res;
    }

    /**
     * @return the mensagem
     */
    public String getMensagem() {
        return mensagem;
    }

    /**
     * @param mensagem the mensagem to set
     */
    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }
}
